package org.soderiakelvy.controller.sujeto;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.soderiakelvy.controller.util.Constante;
import org.soderiakelvy.model.domain.DesProdTipoCliVO;
import org.soderiakelvy.model.domain.SucursalProductoVO;
import org.soderiakelvy.model.domain.SucursalVO;
import org.soderiakelvy.model.domain.SujetoVO;
import org.soderiakelvy.model.domain.TipoClienteVO;
import org.soderiakelvy.model.service.SucursalServicio;
import org.soderiakelvy.model.service.SujetoServicio;
import org.soderiakelvy.model.service.imp.SucursalServicioImp;
import org.soderiakelvy.model.service.imp.SujetoServicioImpl;

@ManagedBean
@ViewScoped
public class SujetoEmpresaProducto implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	//--- VO & Service ---
	private SucursalVO sucursal;
	private SujetoVO sujeto;	
	private TipoClienteVO tipoCliente;
	private SucursalServicio serviceSucursal;
	private SujetoServicio serviceSujeto;
	//--------------------
	
	//--- VARIABLES ---
	private String tipoCrud,titulo;
	private boolean isUpdate;
	private boolean isEmpresa;
	private List<SucursalProductoVO> productosAsignados;
	private List<DesProdTipoCliVO> productosDisponibles;
	private DesProdTipoCliVO[] productosSeleccionados;
	//-----------------
	
	//--- CONSTRUCTOR ---
	public SujetoEmpresaProducto(){
		serviceSujeto = new SujetoServicioImpl();
		serviceSucursal = new SucursalServicioImp();
		getTipoCrud();
	}
	
	private void getTipoCrud(){
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();
		tipoCrud = (String) sessionParams.get("tipoCrudProducto");
		sucursal = (SucursalVO) sessionParams.get("sucursalUpdateCreate");
		if(tipoCrud != null && sucursal != null){
			sujeto = sucursal.getSujeto();
			tipoCliente = serviceSujeto.getTipoClienteById(sujeto.getTipoCliente().getTipoClienteId());
			System.out.println("Tipo de cliente: "+tipoCliente.getNombre());
			if(sujeto.getTipoSujeto().equals(Constante.SUJETO_EMPRESA)){
				isEmpresa = true;
			}else {
				isEmpresa = false;
			}
			if(tipoCrud.equals(Constante.SUJETO_EMPRESA_PRODUCTO_CREATE)){
				titulo="Alta Sujeto - Asignar Productos";
				isUpdate = false;
				productosDisponibles = serviceSujeto.getProductosConDescuentoByTipoCliente(tipoCliente);
			}else{
				if(tipoCrud.equals(Constante.SUJETO_EMPRESA_PRODUCTO_UPDATE)){
					titulo = "Actualizar Productos"; 
					isUpdate = true;
					getSucursalProducto();
				}
			}
		}else{
			System.out.println("Hubo un error al instaciar la clase. Error de navegacion");
		}
	}
	
	
	//-------------------
	
	public void btnBuscarProductosDisponibles(){
		if(productosAsignados != null){
			productosDisponibles = serviceSujeto.getProductosConDescuentoByTipoCliente(tipoCliente);
			List<DesProdTipoCliVO> removeProductos = new ArrayList<DesProdTipoCliVO>();
			for(SucursalProductoVO sucPro: productosAsignados){
				for(DesProdTipoCliVO des : productosDisponibles){
					if(des.getProducto().equals(sucPro.getProductoDescuento().getProducto())){
						removeProductos.add(des);
					}
				}
				productosDisponibles.removeAll(removeProductos);
			}			
		}
	}
	
	public void btnAsignarProductosSeleccinoados(){
		serviceSucursal.assignProductosSucursal(getSucursal(), getProductosSeleccionados());
		getSucursalProducto();
	}

	public void btnEliminarProductoAsignado(SucursalProductoVO producto){
		serviceSucursal.deleteSucursalProductoVO(producto);
		getSucursalProducto();
	}
	
	public String btnTerminar(){
		System.out.println("redireccionando a index");
		return "index.html?faces-redirect=true";
	}
	
	private void getSucursalProducto(){
		SucursalServicio service = new SucursalServicioImp();
		productosAsignados = service.getProductosPorSucursal(getSucursal()); 		
	}
	
	public String irComercializacionMesVencido(){
		System.out.println("Voy a comercializacion mes vencido");
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();		
		sessionParams.put("tipoCrudComercializacionMesVencido",Constante.SUJETO_EMPRESA_COMERCIALIZACION_MES_VENCIDO_CREATE);
		sessionParams.put("sucursalUpdateComercializacionPack",getSucursal());
		return "sujetoEmpresaMesVencido.xhtml?faces-redirect=true";
	}
	
	public String irComericaliazacionPack(){
		System.out.println("Voy a comercializacion pack ");	
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,Object> sessionParams = fc.getExternalContext().getSessionMap();		
		sessionParams.put("tipoCrudComercializacionPack",Constante.SUJETO_EMPRESA_COMERCIALIZACION_PACK_CREATE);
		sessionParams.put("sucursalUpdateComercializacionPack",getSucursal());
		return "sujetoEmpresaPack.xhtml?faces-redirect=true";
	}
	
	//--- GET AND SET 
	public SucursalVO getSucursal() {
		return sucursal;
	}  

	public String getTitulo() {
		return titulo;
	}

	public boolean getIsUpdate() {
		return !isUpdate;
	}

	public boolean getIsEmpresa(){
		return isEmpresa;
	}

	public SujetoVO getSujeto() {
		return sujeto;
	}

	public List<DesProdTipoCliVO> getProductosDisponibles() {
		return productosDisponibles;
	}

	public List<SucursalProductoVO> getProductosAsignados() {
		return productosAsignados;
	}

	public DesProdTipoCliVO[] getProductosSeleccionados() {
		return productosSeleccionados;
	}

	public void setProductosSeleccionados(DesProdTipoCliVO[] productosSeleccionados) {
		this.productosSeleccionados = productosSeleccionados;
	}

	public TipoClienteVO getTipoCliente() {
		return tipoCliente;
	}

}
